package com.misyi.designpattern.memento;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * 备忘录模式
 *
 * @author licong
 * @date 2021-09-14 下午7:06
 */
public class MementoPatternDemo {

    public static void main(String[] args) {
        Originator originator = new Originator();
        // 准备数据
        Memento memento = originator.prepare();
        // 存储数据
        Caretaker caretaker = new Caretaker();
        caretaker.saveMemento(memento);
        // 执行A方法
        originator.executeA();
        // 取回数据, 并重新设置到发起人中
        originator.setMemento(caretaker.retrieveMemento());
        // 执行B方法
        originator.executeB();
        // 打印最终数据
        System.out.println(originator.getMemento());
    }


    // 数据源
    @Data
    @AllArgsConstructor
    public static class Memento {
        // 备忘状态数据
        private String state;

        @Override
        protected Memento clone() {
            return new Memento(this.getState());
        }
    }

    @Data
    public static class Originator {
        private Memento memento;

        public Memento prepare() {
            memento = new Memento("中间数据");
            return memento;
        }

        public void executeA() {
            System.out.println("基于中间数据[" + memento + "]执行了A方法");
            memento.setState(memento.state + ", A方法执行的结果数据");
        }

        public void executeB() {
            System.out.println("基于中间数据[" + memento + "]执行了B方法");
            memento.setState(memento.state + ", B方法执行的结果数据");
        }
    }

    // 用于存储中间数据的容器
    public static class Caretaker {
        private Memento memento;

        public void saveMemento(Memento memento) {
            this.memento = memento.clone();
        }

        public Memento retrieveMemento() {
            return memento;
        }
    }

}
